package demo.config;

import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * 这些注解通常用于条件配置和自动化的一部分，特别是在自动配置和条件注入的场景中。下面是对每个注解的详细解释：
 * 这些注解通常用于Spring Boot的自动配置中，以便根据条件灵活地配置Bean，从而提高应用程序的灵活性和可配置性。<p><br>
 */
/*@ConditionalOnBean
作用: 表示当容器中存在指定的Bean时，应用该配置。
使用场景: 如果你只有在某些Bean可用时才想让特定的配置生效，比如依赖于某个服务的功能，可以使用此注解。*/
@ConditionalOnBean
/*@ConditionalOnClass
作用: 表示当某个特定的类在类路径上时，应用该配置。
使用场景: 如果某个功能只有在特定的库存在时才需要被配置，可以使用此注解。例如，在需要使用JPA的配置时，可以检查JPA的类是否存在。*/
@ConditionalOnClass({String.class})
/*@ConditionalOnExpression
作用: 允许使用SpEL（Spring Expression Language）表达式来控制配置是否生效。
使用场景: 当你需要根据某些复杂的逻辑条件来进行配置时，可以使用此注解。*/
@ConditionalOnExpression
/*@ConditionalOnMissingBean
作用: 当容器中缺少指定的Bean时，应用该配置。
使用场景: 如果你想要确保只有在某个Bean不存在的情况下，才提供一个默认的实现，可以使用此注解。*/
@ConditionalOnMissingBean(name = "example")
/*@ConditionalOnMissingClass
作用: 表示当指定的类不在类路径上时，应用该配置。
使用场景: 通常用于提供某个特性的替代方案，例如，在不需要特定功能时，应用不同的配置。*/
@ConditionalOnMissingClass
/*@ConditionalOnNotWebApplication
作用: 表示当不是Web应用程序时，应用该配置。
使用场景: 用于指定在非Web环境下的配置，比如某些服务只在非Web应用时才有效。*/
@ConditionalOnNotWebApplication
/*@Configuration
作用: 表示一个配置类，提供一个或多个Bean的定义。
使用场景: 用于创建配置类，通常与其他注解结合使用，来定义应用程序的上下文。*/
@Configuration
/*@EnableConfigurationProperties
作用: 用于启用对指定属性类的绑定，方便使用配置文件中的属性。
使用场景: 当想要将配置文件中的属性映射到一个POJO类时，可以使用此注解。*/
@EnableConfigurationProperties()
/* @AutoConfigureBefore
作用: 该注解用于指定当前自动配置类应该在特定的自动配置类之前生效。
使用场景: 用于按顺序加载自动配置类，以确保某些配置优先或被覆盖。*/
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
/*@ConditionalOnProperty
作用: 当某个特定的配置属性存在并满足条件时，应用该配置。
使用场景: 经常用于启用或禁用特定的功能或配置，依赖于外部配置文件中的值。*/
@ConditionalOnProperty(prefix = "eros.jdbc", name = "enabledDefaultDataSource", matchIfMissing = true)
public class ConfigurationDemo {

}
